package reflection;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

// 目标类：包含不同方法的Calculator类
class Calculator {
    // 公共实例方法
    public int add(int a, int b) {
        return a + b;
    }

    // 私有实例方法
    private String concat(String s1, String s2) {
        return s1 + s2;
    }

    // 静态方法
    public static double multiply(double a, double b) {
        return a * b;
    }
}

public class InvokeMethods {
    public static void main(String[] args) throws ClassNotFoundException,
            InstantiationException, IllegalAccessException,
            NoSuchMethodException, InvocationTargetException {

        // 1. 创建对象
        Class<?> calculatorClass = Class.forName("Calculator");
        Calculator calculator = (Calculator) calculatorClass.newInstance();

        // 2. 调用公共实例方法
        // 参数1：方法名；参数2：方法参数类型（.class）
        Method addMethod = calculatorClass.getMethod("add", int.class, int.class);
        // 调用方法：参数1：目标对象；参数2：实际参数值
        int sum = (int) addMethod.invoke(calculator, 3, 5);
        System.out.println("3 + 5 = " + sum);

        // 3. 调用私有方法
        Method concatMethod = calculatorClass.getDeclaredMethod("concat", String.class, String.class);
        concatMethod.setAccessible(true); // 允许访问私有方法
        String result = (String) concatMethod.invoke(calculator, "Hello", " Reflection");
        System.out.println("字符串拼接：" + result);

        // 4. 调用静态方法（invoke的第一个参数传null）
        Method multiplyMethod = calculatorClass.getMethod("multiply", double.class, double.class);
        double product = (double) multiplyMethod.invoke(null, 2.5, 4.0); // 静态方法无需对象
        System.out.println("2.5 * 4.0 = " + product);
    }
}
